// 路由鉴权： 鉴权，项目中路由能不能被访问的权限的设置（某一个路由什么条件下可以访问，什么条件下不可以访问）
import router from './router'
import nprogress from 'nprogress'
import 'nprogress/nprogress.css'
import { useUserStore } from './store/modules/user'
import pinia from './store'
import setting from './setting'

const userStore = useUserStore(pinia)

// 设置不启用转圈加载动画
nprogress.configure({ showSpinner: false })

// 全局守卫：项目中任意路由切换都会触发的钩子

// 全局前置守卫
router.beforeEach(async (to) => {
  // 开启进度条动画
  nprogress.start()

  // 获取token，判断用户是否登录
  let token = userStore.token
  // 获取用户名字
  let username = userStore.username

  if (token) {
    if (to.path === '/login') {
      return { path: '/' }
    } else {
      // 登录成功，访问其余六个路由
      // 有用户信息
      if (username) {
          // 放行
          return true
        
      } else {
        // 没有用户信息，在守卫中发请求获取到用户信息再放行
        // try {
          await userStore.getUserInfo()
        // 万一刷新的时候是异步路由，有可能获取到用户信息，但异步路由还没有加载完毕，出现空白的效果,需要保证加载完成后再放行，可以考虑使用next({...to, replace: true})
          return true 
        // } catch (error) {
        //   // 这里是没有用户信息并且信息还没拿到的情况，通常分为两类
        //   // 1.token过期失效
        //   // 2.token被修改
        //   // 操作，清除用户信息，回到登录界面
        //   await userStore.userLogout()
        //   return {
        //     path: '/login',
        //     query: { redirect: to.path },
        //   }
        // }
      }
    }
  } else {
    if (to.path === '/login') {
      return true
    } else {
      return {
        path: '/login',
        query: { redirect: to.path },
      }
    }
  }
})

// // 全局后置守卫
router.afterEach((to) => {
  document.title = `${setting.title}-${to.meta.title}`
  nprogress.done()
})

// 第一个问题，任意路由切换实现进度条业务 ---- nprogress
// 第二个问题：路由鉴权(路由组件访问权限的设置)
// 全部路由组件：404||首页||数据大屏||登录||任意路由||权限管理(三个子路由)||商品管理(四个子路由)

// 用户未登录：可以访问login，其余六个路由不能访问
// 用户登录成功：不可以访问login[指向首页]，其余路由可以访问
